/**
 * 按钮权限工具函数
 * 用于在组件中检查用户是否有某个按钮的权限
 */

import store from '@/store';

/**
 * 获取用户的所有按钮权限（扁平化列表）
 * @returns {Array} 按钮权限列表，格式：[{ menu_path: 'student:add', menu_name: '添加学生', ... }]
 */
export function getUserButtonPermissions() {
  // 只使用从接口获取的按钮权限（allButtonPermissions）
  return store.getters['user/buttonPermissions'] || [];
}

/**
 * 检查用户是否有指定按钮的权限
 * @param {string} buttonCode - 按钮标识，如 'student:add', 'teacher:edit' 等
 * @param {string} parentMenuPath - 可选，父菜单路径，用于更精确的匹配
 * @returns {boolean} 是否有权限
 */
export function hasButtonPermission(buttonCode, parentMenuPath = null) {
  if (!buttonCode) {
    return false;
  }

  const buttonPermissions = getUserButtonPermissions();
  
  // 精确匹配按钮标识
  const hasPermission = buttonPermissions.some(button => {
    if (button.menu_path === buttonCode) {
      // 如果指定了父菜单路径，需要进一步验证
      if (parentMenuPath) {
        // 这里需要根据实际情况判断按钮是否属于指定的父菜单
        // 可以通过 parent_id 关联查找父菜单
        // 注意：这里需要从 menuTree 中查找父菜单，因为按钮权限列表中没有菜单信息
        const allMenuList = store.getters['user/allMenuList'] || [];
        const parentMenu = allMenuList.find(
          menu => menu.id === button.parent_id && menu.menu_path === parentMenuPath
        );
        return !!parentMenu;
      }
      return true;
    }
    return false;
  });

  return hasPermission;
}

/**
 * 检查用户是否有指定模块的按钮权限
 * @param {string} module - 模块名称，如 'student', 'teacher', 'class' 等
 * @param {string} action - 操作类型，如 'add', 'edit', 'delete', 'import', 'export', 'view'
 * @returns {boolean} 是否有权限
 */
export function hasModuleButtonPermission(module, action) {
  if (!module || !action) {
    return false;
  }

  const buttonCode = `${module}:${action}`;
  return hasButtonPermission(buttonCode);
}

/**
 * 获取指定模块的所有按钮权限
 * @param {string} module - 模块名称，如 'student', 'teacher', 'class' 等
 * @returns {Array} 按钮权限列表
 */
export function getModuleButtonPermissions(module) {
  if (!module) {
    return [];
  }

  const buttonPermissions = getUserButtonPermissions();
  return buttonPermissions.filter(button => {
    const buttonCode = button.menu_path || '';
    return buttonCode.startsWith(`${module}:`);
  });
}

/**
 * 按钮权限指令（Vue 指令）
 * 使用方法：v-button-permission="'student:add'"
 */
export const buttonPermissionDirective = {
  inserted(el, binding) {
    const buttonCode = binding.value;
    if (!hasButtonPermission(buttonCode)) {
      // 如果没有权限，隐藏按钮
      el.style.display = 'none';
      // 或者移除元素
      // el.parentNode && el.parentNode.removeChild(el);
    }
  },
  update(el, binding) {
    const buttonCode = binding.value;
    if (!hasButtonPermission(buttonCode)) {
      el.style.display = 'none';
    } else {
      el.style.display = '';
    }
  }
};

/**
 * 按钮权限组件混入（Vue Mixin）
 * 在组件中使用：mixins: [buttonPermissionMixin]
 * 然后可以使用：this.hasButtonPermission('student:add')
 */
export const buttonPermissionMixin = {
  methods: {
    /**
     * 检查是否有按钮权限
     * @param {string} buttonCode - 按钮标识
     * @param {string} parentMenuPath - 可选，父菜单路径
     * @returns {boolean}
     */
    hasButtonPermission(buttonCode, parentMenuPath = null) {
      return hasButtonPermission(buttonCode, parentMenuPath);
    },
    
    /**
     * 检查是否有模块按钮权限
     * @param {string} module - 模块名称
     * @param {string} action - 操作类型
     * @returns {boolean}
     */
    hasModuleButtonPermission(module, action) {
      return hasModuleButtonPermission(module, action);
    },
    
    /**
     * 获取模块的所有按钮权限
     * @param {string} module - 模块名称
     * @returns {Array}
     */
    getModuleButtonPermissions(module) {
      return getModuleButtonPermissions(module);
    }
  }
};

export default {
  getUserButtonPermissions,
  hasButtonPermission,
  hasModuleButtonPermission,
  getModuleButtonPermissions,
  buttonPermissionDirective,
  buttonPermissionMixin,
};

